package com.zhaoyu.utils.common;

import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.util.DigestUtils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {

    /**
     * MD5加密
     */
    public final static String encode(String str) {
        try {
            // 创建具有指定算法名称的摘要
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 使用指定的字节数组更新摘要
            md.update(str.getBytes());
            // 进行哈希计算并返回一个字节数组
            byte mdBytes[] = md.digest();
            String hash = "";
            // 循环字节数组
            for (int i = 0; i < mdBytes.length; i++) {
                int temp;
                //如果有小于0的字节,则转换为正数
                if (mdBytes[i] < 0)
                    temp = 256 + mdBytes[i];
                else
                    temp = mdBytes[i];
                if (temp < 16)
                    hash += "0";
                // 将字节转换为16进制后,转换为字符串
                hash += Integer.toString(temp, 16);
            }
            return hash;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

    public static String encodeWithSalt(String numStr, String salt) {
        return encode(encode(numStr) + salt);
    }

    /**
     * 赵宇：MD5Utils密码加密入门
     * 手动加密（MD5+随机字符串）
     * 默认加密/自定义加密
     */
    public static void main(String[] args) {
        String s1 = RandomStringUtils.randomAlphanumeric(10, 100); // 获取一个10位-100位的随机字符串
        String s2 = RandomStringUtils.randomAlphanumeric(10); // 获取一个10位的随机字符串
        System.out.println(s1); // 10位-100位的随机字符串——————>盐值
        System.out.println(s1.length()); // 随机字符串的长度——————>盐值长度
        System.out.println(s2); // 10位的随机字符串——————>盐值
        System.out.println(s2.length()); // 随机字符串的长度——————>盐值长度

        String pwd1 = "123456" + s1;
        String salt1 = DigestUtils.md5DigestAsHex(pwd1.getBytes()); // 根据自定义数字+随机字符串/盐值对密码进行加密
        System.out.println(s1); // 盐值
        System.out.println(salt1); // 加密后的密码
        System.out.println(DigestUtils.md5DigestAsHex(pwd1.getBytes()).equals(salt1)); // 校验初始密码和加密后密码是否相同

        String pwd2 = "123456" + s2;
        String salt2 = DigestUtils.md5DigestAsHex(pwd2.getBytes()); // 根据自定义数字+随机字符串/盐值对密码进行加密
        System.out.println(s2); // 盐值
        System.out.println(salt2); // 加密后密码
        System.out.println(DigestUtils.md5DigestAsHex(pwd2.getBytes()).equals(salt2)); // 校验初始密码和加密后密码是否相同

        String pwd3 = DigestUtils.md5DigestAsHex("123456".getBytes()); // 将自己定义的密码进行加密
        System.out.println(pwd3); // 获取加密后随机32位密码(包含数字和字符串)
        System.out.println(pwd3.length()); // 加密后密码的长度
        System.out.println(DigestUtils.md5DigestAsHex("123456".getBytes()).equals(pwd3)); // 校验初始密码和加密后密码是否相同
    }

}